package com.hins.mq.ordinaryMq;

import com.hins.mq.common.Config;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendCallback;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.remoting.common.RemotingHelper;

/**
 * 发送异步消息
 * 异步消息通常用在对响应时间敏感的业务场景，即发送端不能容忍长时间地等待Broker的响应。
 */
public class AsyncProducer {
	public static void main(String[] args) throws Exception {
    	// 实例化消息生产者Producer
        DefaultMQProducer producer = new DefaultMQProducer("ordinary_group");
    	// 设置NameServer的地址
        producer.setNamesrvAddr(Config.namesrvAddr);
    	// 启动Producer实例
        producer.start();
//        producer.setRetryTimesWhenSendAsyncFailed(0);
    	for (int i = 0; i < 10; i++) {
                final int index = i;
            	// 创建消息，并指定Topic，Tag和消息体
                Message msg = new Message("ordinaryTopicTest",
                    "TagA",
                    "OrderID188",
                    "Hello world".getBytes(RemotingHelper.DEFAULT_CHARSET));
                // SendCallback接收异步返回结果的回调
                producer.send(msg, new SendCallback() {
                    @Override
                    public void onSuccess(SendResult sendResult) {
                        System.out.printf("send message success %-10d OK %s %n", index,
                            sendResult.getMsgId());
                    }
                    @Override
                    public void onException(Throwable e) {
      	              System.out.printf("send message failed %-10d Exception %s %n", index, e);
      	              e.printStackTrace();
                    }
            	});
    	}
    	// 如果不再发送消息，关闭Producer实例。
        // 异步消息有个巨坑的地方就是由于是异步消息，所以是由于主线程提前关闭，
        // 导致其他异步的线程也受到影响。于是在producer.shutdown()的上方使主线程睡眠。不然一直报错
        Thread.sleep(3000);
        producer.shutdown();
    }
}